﻿//#include <iostream>
//using namespace std;
//template<class F, class T>
//T useF(F f, T x)
//{
//	static int count = 0;
//	cout << "count:" << ++count << endl;
//	cout << "count:" << &count << endl;
//	return f(x);
//}
//int f1(double i) { return i / 2; }
//double f2(double i) { return i / 3; }
//double f3(double i) { return i / 4; }
//double f4(int i) { return i / 5; }
//int main()
//{
//	/*实例化出的函数返回类型、参数类型相同，输出的count相同
//	，即同一个函数，但若是其中一个类型不同，将会实例化出不同的函数，即输出count不同*/
//	cout << useF(f1, 11.11) << endl;
//	cout << useF(f2, 11.11) << endl;
//	cout << useF(f3, 11.11) << endl;
//	cout << useF(f4, 11.11) << endl;
//	return 0;
//}

//#include <iostream>
//using namespace std;
//#include<functional>
//template<class F, class T>
//T useF(F f, T x)
//{
//	static int count = 0;
//	cout << "count:" << ++count << endl;
//	cout << "count:" << &count << endl;
//	return f(x);
//}
//int f1(double i) { return i / 2; }
//double f2(double i) { return i / 2; }
//double f3(double i)
//{
//	return i / 3;
//}
//struct Functor
//{
//	double operator()(double d)
//	{
//		return d / 3;
//	}
//};
//int main()
//{
//	//函数指针
//	function<double(double)> fc1 = f1;
//	fc1(11.11); //将f1封装成fc1,返回类型double、形参类型double
//	cout << useF(fc1, 11.11) << endl;
//	//下面的函数指针形式输出发现与上面的不同,返回类型和参数类型只要有一个不同，函数模板实例化出的函数就不同,与上代码二原理一样
//	function<double(int)> fcc1 = f2;
//	fcc1(11.11); //将f2封装成fc,此时返回类型int、形参类型double,与f2不同
//	cout << useF(fcc1, 11.11) << endl;
//	//封装函数返回类型和形参类型相同，调用函数相同
//	function<double(double)> fcc2 = f3;
//	fcc2(11.11); //将f3封装成fc2,此时返回类型double、形参类型double，与f3不同
//	cout << useF(fcc2, 11.11) << endl;
//	cout << endl;
//
//	//函数对象
//	function<double(double)> fc2 = Functor();
//	fc2(11.11);
//	cout << useF(fc2, 11.11) << endl;
//
//	// lambda表达式
//	function<double(double)> fc3 = [](double d)->double { return d / 4; };
//	fc3(11.11);
//	cout << useF(fc3, 11.11) << endl;
//
//	function<double(double)> fc1 = f1;
//	cout << useF(fc1, 11.11) << endl;
//	cout << useF(f1, 11.11) << endl;
//	cout << endl;
//
//	function<double(double)> fc2 = [](double d)->double { return d / 4; };
//	cout << useF(fc2, 11.11) << endl;
//	cout << useF([](double d)->double { return d / 4; }, 11.11) << endl;
////	return 0;
//}

//#include <iostream>
//#include<functional>
//using namespace std;
//class Plus
//{
//public:
//	static int plusi(int a, int b)
//	{
//		return a + b;
//	}
//	double plusd(double a, double b)
//	{
//		return a + b;
//	}
//};
//
//int f(int a, int b) { return a + b; }
//
//int main()
//{
//	//普通函数
//	function<int(int, int)> fc1 = f;
//	function<int(int, int)> f1 = &f;
//	cout << fc1(1, 1) << "  " << f1(1, 1) << endl;
//	cout << f << " " << &f << endl; //输出地址一样
//
//	//静态成员函数
//	function<int(int, int)> fc2 = &Plus::plusi;
//	function<int(int, int)> fc = Plus::plusi;
//	cout << fc2(1, 1) << "  " << fc(1, 1) << endl;
//	cout << &Plus::plusi << " " << Plus::plusi << endl; //输出地址一样
//
//	//非静态成员函数
//	//非静态成员函数需要对象的指针或者对象去进行调用，因为类的非静态成员函数第一个默认隐形的参数是this指针
//	Plus plus;
//	function<double(Plus*, double, double)> fc3 = &Plus::plusd; //这里不能使用Plus::plusd
//	cout << fc3(&plus, 1, 1) << endl;
//
//	function<double(Plus, double, double)> fc4 = &Plus::plusd;  //这里不能使用Plus::plusd
//	cout << fc4(plus, 1, 1) << "  " << fc4(Plus(), 1, 1) << endl;
//	return 0;
//}
